package com.cata.mall.portal.service;

import com.cata.mall.common.api.CommonPage;
import com.cata.mall.portal.domain.ConfirmOrderResult;
import com.cata.mall.portal.domain.OmsOrderDetail;
import com.cata.mall.portal.domain.OrderParam;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;

/**
 * @作者: Tao
 * @日期: 2025/10/16
 * @时间: 15:42
 * @描述: 前台订单管理Service<pre>
 */
public interface OmsPortalOrderService {
    /**
     * 根据用户购物车信息生成确认单信息
     * @param cartIds 购物车ID列表
     * @return 确认单结果对象
     */
    ConfirmOrderResult generateConfirmOrder(List<Long> cartIds);

    /**
     * 根据提交信息生成订单
     * @param orderParam 订单参数对象
     * @return 包含订单信息的Map对象
     */
    @Transactional
    Map<String, Object> generateOrder(OrderParam orderParam);

    /**
     * 支付成功后的回调
     * @param orderId 订单ID
     * @param payType 支付类型
     * @return 处理结果状态码
     */
    @Transactional
    Integer paySuccess(Long orderId, Integer payType);

    /**
     * 自动取消超时订单
     * @return 取消的订单数量
     */
    @Transactional
    Integer cancelTimeOutOrder();

    /**
     * 取消单个超时订单
     * @param orderId 订单ID
     */
    @Transactional
    void cancelOrder(Long orderId);

    /**
     * 发送延迟消息取消订单
     * @param orderId 订单ID
     */
    void sendDelayMessageCancelOrder(Long orderId);

    /**
     * 确认收货
     * @param orderId 订单ID
     */
    void confirmReceiveOrder(Long orderId);

    /**
     * 分页获取用户订单
     * @param status 订单状态
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @return 订单详情分页对象
     */
    CommonPage<OmsOrderDetail> list(Integer status, Integer pageNum, Integer pageSize);

    /**
     * 根据订单ID获取订单详情
     * @param orderId 订单ID
     * @return 订单详情对象
     */
    OmsOrderDetail detail(Long orderId);

    /**
     * 用户根据订单ID删除订单
     * @param orderId 订单ID
     */
    void deleteOrder(Long orderId);

    /**
     * 根据orderSn来实现的支付成功逻辑
     * @param orderSn 订单编号
     * @param payType 支付类型
     */
    @Transactional
    void paySuccessByOrderSn(String orderSn, Integer payType);

}
